=== BACKDOOR HUNT === === Code Snippets === Total snippets: 11 --- Snippet #1: Make upload filenames lowercase --- Active: no | Scope: global Code: add_filter( 'sanitize_file_name', 'mb_strtolower' ); --- Snippet #2: Disable admin bar --- Active: no | Scope: front-end Code: add_action( 'wp', function () { if ( ! current_user_can( 'manage_options' ) ) { show_admin_bar( false ); } } ); --- Snippet #3: Allow smilies --- Active: no | Scope: global Code: add_filter( 'widget_text', 'convert_smilies' ); add_filter( 'the_title', 'convert_smilies' ); add_filter( 'wp_title', 'convert_smilies' ); add_filter( 'get_bloginfo', 'convert_smilies' ); --- Snippet #4: Current year --- Active: no | Scope: content Code: --- Snippet #5: not --- Active: no | Scope: global Code: add_action('init', function () { register_post_type('vitrin_purchase', [ 'labels' => [ 'name' => 'اعلان خرید', 'singular_name' => 'اعلان خرید', 'add_new' => 'افزودن خرید جدید', 'add_new_item' => 'افزودن اعلان خرید جدید', 'edit_item' => 'ویرایش اعلان خرید', 'all_items' => 'همه اعلان‌ها', 'menu_name' => 'اعلان خرید', ], 'public' => false, 'show_ui' => true, 'show_in_menu' => true, 'menu_icon' => 'dashicons-cart', 'supports' => ['title'], 'menu_position' => 25, ]); }); add_action('add_meta_boxes', function () { add_meta_box( 'vitrin_purchase_details', 'جزئیات خرید', function ($post) { wp_nonce_field('vitrin_purchase_save', 'vitrin_purchase_nonce'); $city = get_post_meta($post->ID, '_vp_city', true); $product = get_post_meta($post->ID, '_vp_product', true); $link = get_post_meta($post->ID, '_vp_link', true); $minutes = get_post_meta($post->ID, '_vp_minutes', true); ?>





این عدد فقط برای متن «X دقیقه پیش» استفاده می‌شود.

تنظیمات ذخیره شد.

'; } $enabled = get_option('vp_enabled', 1); $position = get_option('vp_position', 'top-left'); $bg = get_option('vp_bg_color', '#ffffff'); $text = get_option('vp_text_color', '#1a1a1a'); $accent = get_option('vp_accent_color', '#9f1239'); $duration = get_option('vp_display_seconds', 6); $min_int = get_option('vp_min_interval', 8); $max_int = get_option('vp_max_interval', 20); $shuffle = get_option('vp_shuffle', 1); ?>

تنظیمات نمایش اعلان خرید

فعال‌سازی نمایش
موقعیت نمایش
رنگ پس‌زمینه
رنگ متن
رنگ تاکیدی، مهر و خط کناری
مدت نمایش هر اعلان، ثانیه
حداقل فاصله بین اعلان‌ها، ثانیه
حداکثر فاصله بین اعلان‌ها، ثانیه
ترتیب نمایش


برای افزودن اعلان‌های خرید، از منوی افزودن خرید جدید استفاده کنید.

طراحی شده توسط علیرضا رحمتی | اینستاگرام : alireza.webcode

'vitrin_purchase', 'post_status' => 'publish', 'posts_per_page' => 50, 'orderby' => 'date', 'order' => 'DESC', ]); if (empty($posts)) { return; } $items = []; foreach ($posts as $p) { $minutes = intval(get_post_meta($p->ID, '_vp_minutes', true)) ?: 5; $items[] = [ 'name' => wp_strip_all_tags(get_the_title($p)), 'city' => wp_strip_all_tags(get_post_meta($p->ID, '_vp_city', true)), 'product' => wp_strip_all_tags(get_post_meta($p->ID, '_vp_product', true)), 'link' => esc_url(get_post_meta($p->ID, '_vp_link', true)), 'minutes' => max(1, $minutes), ]; } $settings = [ 'position' => get_option('vp_position', 'top-left'), 'bgColor' => get_option('vp_bg_color', '#ffffff'), 'textColor' => get_option('vp_text_color', '#1a1a1a'), 'accentColor' => get_option('vp_accent_color', '#9f1239'), 'displaySeconds' => intval(get_option('vp_display_seconds', 6)), 'minInterval' => intval(get_option('vp_min_interval', 8)), 'maxInterval' => intval(get_option('vp_max_interval', 20)), 'shuffle' => (bool) get_option('vp_shuffle', 1), ]; wp_register_script('vp-purchase-notice', false, [], '1.2', true); wp_enqueue_script('vp-purchase-notice'); wp_localize_script('vp-purchase-notice', 'VP_DATA', [ 'items' => $items, 'settings' => $settings, ]); wp_add_inline_script('vp-purchase-notice', vitrin_purchase_js()); }, 20); add_action('wp_head', function () { if (!get_option('vp_enabled', 1) || is_admin()) { return; } echo ''; }); function vitrin_purchase_css() { return << 0; i--) { var j = Math.floor(Math.random() * (i + 1)); var tmp = items[i]; items[i] = items[j]; items[j] = tmp; } } document.addEventListener('DOMContentLoaded', function () { if (!document.body || !items.length) { return; } var wrap = document.createElement('div'); wrap.className = 'vp-notice-wrap vp-' + settings.position; wrap.style.setProperty('--vp-bg', settings.bgColor || '#ffffff'); wrap.style.setProperty('--vp-text', settings.textColor || '#1a1a1a'); wrap.style.setProperty('--vp-accent', settings.accentColor || '#9f1239'); document.body.appendChild(wrap); var data = items[0]; var durationMs = settings.displaySeconds * 1000; var card = document.createElement('div'); card.className = 'vp-notice-card'; card.innerHTML = '' + '
' + '
' + '' + '
' + '
' + '
' + '
' + '

' + escapeHtml(data.name) + '' + (data.city ? ' از ' + escapeHtml(data.city) : '') + '

' + '

' + escapeHtml(data.product) + ' رو خرید کرد

' + '

' + escapeHtml(data.minutes) + ' دقیقه پیش

' + '
' + '
' + '
'; if (data.link) { card.addEventListener('click', function (e) { if (e.target.closest('.vp-notice-close')) { return; } window.open(data.link, '_blank', 'noopener'); }); } var closeBtn = card.querySelector('.vp-notice-close'); var dismissed = false; var hideTimer; var remaining = durationMs; var startedAt = Date.now(); closeBtn.addEventListener('click', function (e) { e.stopPropagation(); dismiss(); }); wrap.innerHTML = ''; wrap.appendChild(card); try { if (window.localStorage) { localStorage.setItem(storageKey, '1'); } } catch (e) {} var bar = card.querySelector('.vp-notice-progress-bar'); requestAnimationFrame(function () { card.classList.add('vp-show'); requestAnimationFrame(function () { bar.style.transition = 'transform ' + remaining + 'ms linear'; bar.style.transform = 'scaleX(0)'; }); }); startTimer(); function startTimer() { startedAt = Date.now(); hideTimer = setTimeout(dismiss, remaining); } function pauseTimer() { clearTimeout(hideTimer); remaining -= Date.now() - startedAt; if (remaining < 300) { remaining = 300; } bar.style.transition = 'none'; bar.style.transform = 'scaleX(' + getScaleX(bar) + ')'; } function resumeTimer() { startTimer(); requestAnimationFrame(function () { bar.style.transition = 'transform ' + remaining + 'ms linear'; bar.style.transform = 'scaleX(0)'; }); } card.addEventListener('mouseenter', pauseTimer); card.addEventListener('mouseleave', resumeTimer); function getScaleX(el) { var transform = getComputedStyle(el).transform; if (transform === 'none') { return 1; } var match = transform.match(/matrix\\(([^)]+)\\)/); if (!match) { return 1; } return parseFloat(match[1].split(',')[0]) || 0; } function dismiss() { if (dismissed) { return; } dismissed = true; clearTimeout(hideTimer); card.classList.remove('vp-show'); setTimeout(function () { if (wrap.parentNode) { wrap.parentNode.removeChild(wrap); } }, 400); } function escapeHtml(str) { if (str === null || typeof str === 'undefined') { return ''; } return String(str).replace(/[&<>"']/g, function (m) { return { '&': '&', '<': '<', '>': '>', '"': '"', "'": ''' }[m]; }); } }); })(); JS; } --- Snippet #6: bala --- Active: YES | Scope: global Code: /* ========================= 1. ADMIN SETTINGS PAGE ========================= */ add_action('admin_menu', function () { add_menu_page( 'Top Bar Settings', 'Top Bar', 'manage_options', 'al-topbar-settings', 'al_topbar_settings_page', 'dashicons-megaphone', 80 ); }); function al_topbar_settings_page() { if (isset($_POST['al_topbar_save'])) { update_option('al_topbar_messages', sanitize_textarea_field($_POST['al_topbar_messages'])); echo '

ذخیره شد ✔

'; } $messages = get_option('al_topbar_messages', "🔥 تخفیف ویژه امروز\n🚀 ارسال سریع\n💎 کیفیت حرفه‌ای"); ?>

تنظیمات نوار اعلان

هر خط = یک پیام جدا

ساخته شده توسط علیرضا رحمتی | اینستاگرام : alireza.webcode

table_name = $wpdb->prefix . 'phone_lead_snippet_leads'; // ایجاد جدول پایگاه‌داده در اولین اجرا if ( is_admin() ) { $this->maybe_create_table(); } // تزریق مستقیم و خودکار پاپ‌آپ به انتهای تمام صفحات سایت add_action( 'wp_footer', array( $this, 'inject_popup_to_footer' ) ); // کدهای CSS و JS add_action( 'wp_enqueue_scripts', array( $this, 'enqueue_assets' ) ); // هندل کردن ثبت AJAX فرم add_action( 'wp_ajax_pls_submit_lead', array( $this, 'submit_lead' ) ); add_action( 'wp_ajax_nopriv_pls_submit_lead', array( $this, 'submit_lead' ) ); // پنل مدیریت add_action( 'admin_menu', array( $this, 'admin_menu' ) ); add_action( 'admin_post_pls_export_csv', array( $this, 'export_csv' ) ); add_action( 'admin_post_pls_delete_lead', array( $this, 'delete_lead' ) ); } private function maybe_create_table() { global $wpdb; if ( $wpdb->get_var( "SHOW TABLES LIKE '{$this->table_name}'" ) != $this->table_name ) { $charset_collate = $wpdb->get_charset_collate(); $sql = "CREATE TABLE {$this->table_name} ( id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, phone VARCHAR(255) NOT NULL, page_url TEXT NULL, user_ip VARCHAR(100) NULL, created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (id) ) $charset_collate;"; require_once ABSPATH . 'wp-admin/includes/upgrade.php'; dbDelta( $sql ); } } public function enqueue_assets() { wp_register_style( 'pls-style', false ); wp_enqueue_style( 'pls-style' ); // استایل‌های پاپ‌آپ $css = " .plp-overlay{ position:fixed; inset:0; background:rgba(15,23,42,.5); backdrop-filter:blur(4px); z-index:999999; display:none; align-items:center; justify-content:center; padding:16px; } .plp-overlay.plp-open{ display:flex; } .plp-modal{ width:100%; max-width:400px; background:#fff; border-radius:20px; overflow:hidden; box-shadow:0 30px 80px rgba(2,6,23,.22); transform:translateY(10px) scale(.98); opacity:0; transition:all .25s ease; direction:rtl; position:relative; } .plp-overlay.plp-open .plp-modal{ transform:translateY(0) scale(1); opacity:1; } .plp-top{ padding:26px 24px 20px; background:linear-gradient(135deg,#1e293b,#0f172a); color:#fff; position:relative; } .plp-badge{ display:inline-block; font-size:11px; font-weight:700; background:rgba(255,255,255,.12); border:1px solid rgba(255,255,255,.18); border-radius:999px; padding:4px 10px; margin-bottom:12px; color: #38bdf8; } .plp-title{ margin:0 0 8px; font-size:20px; line-height:1.5; font-weight:800; color:#fff; } .plp-desc{ margin:0; font-size:13px; line-height:1.8; color:rgba(255,255,255,.85); } .plp-close{ position:absolute; top:16px; left:16px; width:32px; height:32px; border:none; border-radius:50%; background:rgba(255,255,255,.1); color:#fff; font-size:22px; cursor:pointer; display:flex; align-items:center; justify-content:center; line-height: 1; transition: background .2s; } .plp-close:hover{ background:rgba(255,255,255,.2); } .plp-body{ padding:22px; background: #fff; } .plp-field{ display:block; width:100%; height:50px; border:1px solid #e2e8f0; border-radius:12px; padding:0 16px; font-size:14px; background:#f8fafc; box-sizing:border-box; outline:none; transition:border-color .2s ease, box-shadow .2s ease; text-align: center; } .plp-field:focus{ border-color:#0f172a; box-shadow:0 0 0 4px rgba(15,23,42,.08); background:#fff; } .plp-submit{ width:100%; height:50px; margin-top:12px; border:none; border-radius:12px; background:linear-gradient(135deg,#0f172a,#1e293b); color:#fff; font-size:15px; font-weight:800; cursor:pointer; transition:transform .15s ease, opacity .15s ease; } .plp-submit:hover{ transform:translateY(-1px); opacity: 0.95; } .plp-submit:disabled{ opacity:.7; cursor:not-allowed; transform:none; } .plp-note{ margin-top:12px; font-size:11px; color:#64748b; text-align:center; line-height:1.8; } .plp-message{ display:none; margin-top:12px; padding:11px 12px; border-radius:10px; font-size:13px; line-height:1.8; text-align: center; } .plp-message.plp-success{ display:block; background:#ecfdf5; color:#166534; border:1px solid #bbf7d0; } .plp-message.plp-error{ display:block; background:#fef2f2; color:#991b1b; border:1px solid #fecaca; } @media (max-width:480px){ .plp-top{ padding:20px 18px 16px; } .plp-title{ font-size:18px; } .plp-body{ padding:18px; } }"; wp_add_inline_style( 'pls-style', $css ); wp_register_script( 'pls-script', false, array(), null, true ); wp_enqueue_script( 'pls-script' ); wp_localize_script( 'pls-script', 'PLP_DATA', array( 'ajax_url' => admin_url( 'admin-ajax.php' ), 'nonce' => wp_create_nonce( 'pls_nonce' ), ) ); // جاوااسکریپت با کوکی ۳۰ روزه $js = " document.addEventListener('DOMContentLoaded', function () { function setPLPCookie(name, value, days) { var expires = ''; if (days) { var date = new Date(); date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000)); expires = '; expires=' + date.toUTCString(); } document.cookie = name + '=' + (value || '') + expires + '; path=/'; } function getPLPCookie(name) { var nameEQ = name + '='; var ca = document.cookie.split(';'); for (var i = 0; i < ca.length; i++) { var c = ca[i]; while (c.charAt(0) == ' ') c = c.substring(1, c.length); if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length, c.length); } return null; } // بستن با پس‌زمینه document.querySelectorAll('.plp-overlay').forEach(function (overlay) { overlay.addEventListener('click', function (e) { if (e.target === overlay) { overlay.classList.remove('plp-open'); setPLPCookie('plp_dismissed', '1', 30); } }); }); // بستن با ضربدر document.querySelectorAll('[data-plp-close]').forEach(function (button) { button.addEventListener('click', function () { var overlay = button.closest('.plp-overlay'); if (overlay) { overlay.classList.remove('plp-open'); setPLPCookie('plp_dismissed', '1', 30); } }); }); // بستن با Esc document.addEventListener('keydown', function (e) { if (e.key === 'Escape') { document.querySelectorAll('.plp-overlay.plp-open').forEach(function (overlay) { overlay.classList.remove('plp-open'); setPLPCookie('plp_dismissed', '1', 30); }); } }); // ارسال فرم document.querySelectorAll('.plp-form').forEach(function (form) { form.addEventListener('submit', function (e) { e.preventDefault(); var phone = form.querySelector('.plp-phone'); var button = form.querySelector('.plp-submit'); var message = form.querySelector('.plp-message'); message.className = 'plp-message'; message.style.display = 'none'; message.textContent = ''; if (!phone.value.trim()) { message.className = 'plp-message plp-error'; message.textContent = 'لطفاً شماره تماس را وارد کنید.'; message.style.display = 'block'; phone.focus(); return; } button.disabled = true; button.textContent = 'در حال ارسال...'; var formData = new FormData(); formData.append('action', 'pls_submit_lead'); formData.append('nonce', PLP_DATA.nonce); formData.append('phone', phone.value.trim()); formData.append('page_url', window.location.href); fetch(PLP_DATA.ajax_url, { method: 'POST', body: formData }) .then(function (response) { return response.json(); }) .then(function (response) { if (response.success) { message.className = 'plp-message plp-success'; message.textContent = response.data.message; message.style.display = 'block'; form.reset(); setPLPCookie('plp_dismissed', '1', 30); setTimeout(function () { var overlay = form.closest('.plp-overlay'); if (overlay) overlay.classList.remove('plp-open'); }, 1500); } else { message.className = 'plp-message plp-error'; message.textContent = response.data.message || 'خطا در ثبت اطلاعات.'; message.style.display = 'block'; } }) .catch(function () { message.className = 'plp-message plp-error'; message.textContent = 'خطا در ارتباط با سرور.'; message.style.display = 'block'; }) .finally(function () { button.disabled = false; button.textContent = 'ثبت شماره تماس'; }); }); }); // باز شدن خودکار بعد از ۴ ثانیه var autoOverlay = document.getElementById('plp-auto-popup'); if (autoOverlay && !getPLPCookie('plp_dismissed')) { setTimeout(function () { if (!getPLPCookie('plp_dismissed')) { autoOverlay.classList.add('plp-open'); } }, 4000); } });"; wp_add_inline_script( 'pls-script', $js ); } // تزریق مستقیم کد HTML به فوتر public function inject_popup_to_footer() { // برای جلوگیری از باز شدن پاپ‌آپ در صفحات ادمین if ( is_admin() ) { return; } ?>
کلوپ مشتریان صفر کالری

تخفیف‌های ویژه و اطلاع‌رسانی 🎁

برای اطلاع‌رسانی جشنواره‌ها و تخفیف‌های ویژه صفر کالری، شماره تماس خود را وارد کنید.

با عضویت در لیست، زودتر از بقیه کدهای تخفیف داغ را دریافت می‌کنید.
'شماره تماس را وارد کنید.' ) ); } $inserted = $wpdb->insert( $this->table_name, array( 'phone' => $phone, 'page_url' => $page_url, 'user_ip' => $user_ip, 'created_at' => current_time( 'mysql' ), ), array( '%s', '%s', '%s', '%s' ) ); if ( false === $inserted ) { wp_send_json_error( array( 'message' => 'خطایی رخ داد، مجدداً تلاش کنید.' ) ); } wp_send_json_success( array( 'message' => 'شماره شما با موفقیت ثبت شد! به زودی خبرتان می‌کنیم.' ) ); } public function admin_menu() { add_menu_page( 'شماره‌های دریافتی', 'شماره‌های دریافتی', 'manage_options', 'plp-phone-leads', array( $this, 'admin_page' ), 'dashicons-phone', 26 ); } public function admin_page() { global $wpdb; $per_page = 20; $paged = isset( $_GET['paged'] ) ? max( 1, (int) $_GET['paged'] ) : 1; $offset = ( $paged - 1 ) * $per_page; $month = isset( $_GET['filter_month'] ) ? sanitize_text_field( wp_unslash( $_GET['filter_month'] ) ) : ''; $where = '1=1'; $params = array(); if ( ! empty( $month ) && preg_match( '/^\d{4}-\d{2}$/', $month ) ) { $where .= ' AND DATE_FORMAT(created_at, %s) = %s'; $params[] = '%Y-%m'; $params[] = $month; } $count_sql = "SELECT COUNT(*) FROM {$this->table_name} WHERE {$where}"; if ( ! empty( $params ) ) { $total_items = (int) $wpdb->get_var( $wpdb->prepare( $count_sql, ...$params ) ); } else { $total_items = (int) $wpdb->get_var( $count_sql ); } $total_pages = max( 1, (int) ceil( $total_items / $per_page ) ); $data_sql = "SELECT * FROM {$this->table_name} WHERE {$where} ORDER BY id DESC LIMIT %d OFFSET %d"; $data_params = $params; $data_params[] = $per_page; $data_params[] = $offset; if ( ! empty( $data_params ) ) { $rows = $wpdb->get_results( $wpdb->prepare( $data_sql, ...$data_params ) ); } else { $rows = $wpdb->get_results( $data_sql ); } $months = $wpdb->get_col( "SELECT DISTINCT DATE_FORMAT(created_at, '%Y-%m') AS month_val FROM {$this->table_name} ORDER BY month_val DESC" ); $export_url = add_query_arg( array( 'action' => 'pls_export_csv', 'filter_month' => $month, ), admin_url( 'admin-post.php' ) ); ?>

لیست شماره‌های ثبت‌شده در پاپ‌آپ

حذف فیلتر خروجی CSV همین لیست

تعداد کل: شماره | ماه انتخاب‌شده:

شناسه شماره تماس صفحه ثبت درخواست IP کاربر تاریخ ثبت عملیات
id; ?> phone ); ?> page_url ) ) : ?> page_url ); ?> user_ip ); ?> created_at ); ?> حذف شماره
هیچ شماره‌ای برای این فیلتر پیدا نشد.
1 ) { echo '
'; echo paginate_links( array( 'base' => add_query_arg( array( 'page' => 'plp-phone-leads', 'filter_month' => $month, 'paged' => '%#%', ), admin_url( 'admin.php' ) ), 'format' => '', 'current' => $paged, 'total' => $total_pages, 'prev_text' => 'قبلی', 'next_text' => 'بعدی', ) ); echo '
'; } ?>
table_name} WHERE {$where} ORDER BY id DESC"; if ( ! empty( $params ) ) { $rows = $wpdb->get_results( $wpdb->prepare( $sql, ...$params ), ARRAY_A ); } else { $rows = $wpdb->get_results( $sql, ARRAY_A ); } $filename = 'zerocalorie-leads'; if ( $month ) { $filename .= '-' . $month; } else { $filename .= '-' . date( 'Y-m-d' ); } header( 'Content-Type: text/csv; charset=utf-8' ); header( 'Content-Disposition: attachment; filename=' . $filename . '.csv' ); $output = fopen( 'php://output', 'w' ); fwrite( $output, "\xEF\xBB\xBF" ); fputcsv( $output, array( 'ردیف', 'شماره تماس', 'صفحه ثبت', 'IP کاربر', 'تاریخ ثبت' ) ); foreach ( $rows as $row ) { fputcsv( $output, array( $row['id'], $row['phone'], $row['page_url'], $row['user_ip'], $row['created_at'], ) ); } fclose( $output ); exit; } public function delete_lead() { if ( ! current_user_can( 'manage_options' ) ) { wp_die( 'شما دسترسی کافی ندارید.' ); } $id = isset( $_GET['id'] ) ? (int) $_GET['id'] : 0; if ( ! $id || ! check_admin_referer( 'pls_delete_lead_' . $id ) ) { wp_die( 'درخواست نامعتبر است.' ); } global $wpdb; $wpdb->delete( $this->table_name, array( 'id' => $id ), array( '%d' ) ); wp_safe_redirect( admin_url( 'admin.php?page=plp-phone-leads' ) ); exit; } } new Phone_Lead_Snippet_Manager(); --- Snippet #8: foot --- Active: YES | Scope: global Code: /** * Title: Phone Lead Footer Shortcode Form * Description: فرم ساده دریافت شماره با شورت‌کد و ذخیره در همان جدول پاپ‌آپ قبلی */ if ( ! defined( 'ABSPATH' ) ) { exit; } class Phone_Lead_Footer_Shortcode_Form { private $table_name; public function __construct() { global $wpdb; $this->table_name = $wpdb->prefix . 'phone_lead_snippet_leads'; add_shortcode( 'pls_footer_lead_form', array( $this, 'render_shortcode' ) ); add_action( 'wp_enqueue_scripts', array( $this, 'enqueue_assets' ) ); add_action( 'wp_ajax_pls_footer_submit_lead', array( $this, 'submit_lead' ) ); add_action( 'wp_ajax_nopriv_pls_footer_submit_lead', array( $this, 'submit_lead' ) ); } public function enqueue_assets() { wp_register_style( 'pls-footer-form-style', false ); wp_enqueue_style( 'pls-footer-form-style' ); $css = " .pls-footer-lead-wrap{ width:100%; max-width:420px; direction:rtl; } .pls-footer-lead-form{ display:flex; gap:10px; align-items:center; flex-wrap:wrap; } .pls-footer-lead-input{ flex:1 1 220px; min-width:220px; height:44px; padding:0 14px; border:1px solid #d1d5db; border-radius:8px; background:#fff; color:#111827; box-sizing:border-box; } .pls-footer-lead-submit{ height:44px; padding:0 16px; border:none; border-radius:8px; background:#111827; color:#fff; cursor:pointer; white-space:nowrap; } .pls-footer-lead-submit:disabled{ opacity:.7; cursor:not-allowed; } .pls-footer-lead-message{ width:100%; margin-top:10px; font-size:13px; line-height:1.8; display:none; } .pls-footer-lead-message.is-success{ display:block; color:#166534; } .pls-footer-lead-message.is-error{ display:block; color:#b91c1c; }"; wp_add_inline_style( 'pls-footer-form-style', $css ); wp_register_script( 'pls-footer-form-script', false, array(), null, true ); wp_enqueue_script( 'pls-footer-form-script' ); wp_localize_script( 'pls-footer-form-script', 'PLS_FOOTER_FORM_DATA', array( 'ajax_url' => admin_url( 'admin-ajax.php' ), 'nonce' => wp_create_nonce( 'pls_footer_form_nonce' ), ) ); $js = " document.addEventListener('DOMContentLoaded', function () { document.querySelectorAll('.pls-footer-lead-form').forEach(function (form) { form.addEventListener('submit', function (e) { e.preventDefault(); var phoneInput = form.querySelector('.pls-footer-lead-input'); var submitBtn = form.querySelector('.pls-footer-lead-submit'); var messageBox = form.parentNode.querySelector('.pls-footer-lead-message'); if (!phoneInput || !submitBtn || !messageBox) { return; } messageBox.className = 'pls-footer-lead-message'; messageBox.style.display = 'none'; messageBox.textContent = ''; if (!phoneInput.value.trim()) { messageBox.className = 'pls-footer-lead-message is-error'; messageBox.textContent = 'لطفا شماره خود را وارد کنید.'; messageBox.style.display = 'block'; phoneInput.focus(); return; } submitBtn.disabled = true; submitBtn.textContent = 'در حال ثبت...'; var formData = new FormData(); formData.append('action', 'pls_footer_submit_lead'); formData.append('nonce', PLS_FOOTER_FORM_DATA.nonce); formData.append('phone', phoneInput.value.trim()); formData.append('page_url', window.location.href); fetch(PLS_FOOTER_FORM_DATA.ajax_url, { method: 'POST', body: formData }) .then(function (response) { return response.json(); }) .then(function (response) { if (response.success) { messageBox.className = 'pls-footer-lead-message is-success'; messageBox.textContent = response.data.message; messageBox.style.display = 'block'; form.reset(); } else { messageBox.className = 'pls-footer-lead-message is-error'; messageBox.textContent = response.data.message || 'خطا در ثبت اطلاعات.'; messageBox.style.display = 'block'; } }) .catch(function () { messageBox.className = 'pls-footer-lead-message is-error'; messageBox.textContent = 'خطا در ارتباط با سرور.'; messageBox.style.display = 'block'; }) .finally(function () { submitBtn.disabled = false; submitBtn.textContent = 'ثبت شماره'; }); }); }); });"; wp_add_inline_script( 'pls-footer-form-script', $js ); } public function render_shortcode() { ob_start(); ?> 'شماره تماس را وارد کنید.' ) ); } $inserted = $wpdb->insert( $this->table_name, array( 'phone' => $phone, 'page_url' => $page_url, 'user_ip' => $user_ip, 'created_at' => current_time( 'mysql' ), ), array( '%s', '%s', '%s', '%s' ) ); if ( false === $inserted ) { wp_send_json_error( array( 'message' => 'خطایی رخ داد، دوباره تلاش کنید.' ) ); } wp_send_json_success( array( 'message' => 'شماره با موفقیت ثبت شد.' ) ); } } new Phone_Lead_Footer_Shortcode_Form(); --- Snippet #9: off --- Active: YES | Scope: global Code: /** * Title: Zero Calorie SMS Coupons (Fixed Version) * Description: Independent SMS coupon sender and conversion report for Zero Calories. * Version: 1.2.0 */ if ( ! defined( 'ABSPATH' ) ) { exit; } class ZC_SMS_Coupon_System { private $leads_table; private $logs_table; private $ippanel_username = 'u09128343711'; private $ippanel_password = 'Software$123123'; private $sender_number = '+983000505'; private $pattern_code = 'gdqyv37zj3evc2u'; public function __construct() { global $wpdb; // اصلاح نام جدول لید به جدول واقعی شما $this->leads_table = $wpdb->prefix . 'phone_lead_snippet_leads'; $this->logs_table = $wpdb->prefix . 'zc_sms_coupons'; if ( is_admin() ) { $this->maybe_create_table(); add_action( 'admin_menu', array( $this, 'add_admin_menu' ) ); } // هوک شدن به اکشن فرم لید add_action( 'wp_ajax_lpw_submit_lead', array( $this, 'capture_lead_request' ), 1 ); add_action( 'wp_ajax_nopriv_lpw_submit_lead', array( $this, 'capture_lead_request' ), 1 ); add_action( 'woocommerce_order_status_processing', array( $this, 'track_coupon_usage' ), 10, 1 ); add_action( 'woocommerce_order_status_completed', array( $this, 'track_coupon_usage' ), 10, 1 ); } public function maybe_create_table() { global $wpdb; $charset_collate = $wpdb->get_charset_collate(); $table_name = $this->logs_table; require_once ABSPATH . 'wp-admin/includes/upgrade.php'; $sql = "CREATE TABLE {$table_name} ( id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, lead_id BIGINT UNSIGNED DEFAULT NULL, email VARCHAR(190) DEFAULT '', phone VARCHAR(20) NOT NULL, coupon_code VARCHAR(32) NOT NULL, coupon_id BIGINT UNSIGNED NOT NULL, sms_status VARCHAR(20) NOT NULL DEFAULT 'pending', sms_response TEXT DEFAULT NULL, is_used TINYINT(1) NOT NULL DEFAULT 0, order_id BIGINT UNSIGNED DEFAULT NULL, created_at DATETIME NOT NULL, sent_at DATETIME DEFAULT NULL, used_at DATETIME DEFAULT NULL, PRIMARY KEY (id), UNIQUE KEY uniq_phone (phone), UNIQUE KEY uniq_coupon_code (coupon_code), KEY lead_id (lead_id), KEY sms_status (sms_status), KEY is_used (is_used) ) {$charset_collate};"; dbDelta( $sql ); } public function capture_lead_request() { // در جدول جدید شما ایمیل اجباری نیست، پس فقط شماره را چک می‌کنیم $phone = isset( $_POST['phone'] ) ? $this->sanitize_iranian_phone( wp_unslash( $_POST['phone'] ) ) : ''; if ( ! $phone ) { return; } // ثبت اجرای تابع بعد از اتمام ذخیره‌سازی لید توسط افزونه اصلی register_shutdown_function( array( $this, 'handle_after_lead_saved' ), $phone ); } public function handle_after_lead_saved( $phone ) { if ( ! $phone || ! class_exists( 'WooCommerce' ) ) { return; } global $wpdb; // چک کردن تکراری نبودن در جدول لاگ خودمان $already_sent = $wpdb->get_var( $wpdb->prepare( "SELECT id FROM {$this->logs_table} WHERE phone = %s LIMIT 1", $phone ) ); if ( $already_sent ) { return; } // جستجوی آخرین رکورد در جدول لیدهای واقعی شما $lead = $wpdb->get_row( $wpdb->prepare( "SELECT id, phone FROM {$this->leads_table} WHERE phone = %s ORDER BY id DESC LIMIT 1", $phone ) ); if ( ! $lead ) { return; } $coupon = $this->create_woocommerce_coupon(); if ( ! $coupon ) { return; } $inserted = $wpdb->insert( $this->logs_table, array( 'lead_id' => (int) $lead->id, 'phone' => $phone, 'coupon_code' => $coupon['code'], 'coupon_id' => $coupon['id'], 'sms_status' => 'pending', 'created_at' => current_time( 'mysql' ), ), array( '%d', '%s', '%s', '%d', '%s', '%s' ) ); if ( ! $inserted ) { return; } $log_id = (int) $wpdb->insert_id; $sms_result = $this->send_pattern_sms( $phone, $coupon['code'] ); $wpdb->update( $this->logs_table, array( 'sms_status' => $sms_result['success'] ? 'sent' : 'failed', 'sms_response' => $sms_result['message'], 'sent_at' => current_time( 'mysql' ), ), array( 'id' => $log_id ), array( '%s', '%s', '%s' ), array( '%d' ) ); } private function sanitize_iranian_phone( $phone ) { $phone = trim( (string) $phone ); $phone = str_replace( array( ' ', '-', '(', ')' ), '', $phone ); if ( strpos( $phone, '+98' ) === 0 ) { $phone = '0' . substr( $phone, 3 ); } elseif ( strpos( $phone, '0098' ) === 0 ) { $phone = '0' . substr( $phone, 4 ); } elseif ( strpos( $phone, '98' ) === 0 && strlen( $phone ) === 12 ) { $phone = '0' . substr( $phone, 2 ); } $phone = preg_replace( '/[^0-9]/', '', $phone ); if ( preg_match( '/^09[0-9]{9}$/', $phone ) ) { return $phone; } return ''; } private function create_woocommerce_coupon() { $attempts = 0; while ( $attempts < 10 ) { $code = $this->generate_coupon_code( 5 ); if ( ! wc_get_coupon_id_by_code( $code ) ) { $coupon_id = wp_insert_post( array( 'post_title' => $code, 'post_status' => 'publish', 'post_type' => 'shop_coupon', 'post_author' => 1, ) ); if ( is_wp_error( $coupon_id ) || ! $coupon_id ) return false; $expiry_timestamp = current_time( 'timestamp' ) + ( 2 * HOUR_IN_SECONDS ); update_post_meta( $coupon_id, 'discount_type', 'fixed_cart' ); update_post_meta( $coupon_id, 'coupon_amount', '50000' ); update_post_meta( $coupon_id, 'individual_use', 'yes' ); update_post_meta( $coupon_id, 'minimum_amount', '2500000' ); update_post_meta( $coupon_id, 'usage_limit', '1' ); update_post_meta( $coupon_id, 'date_expires', $expiry_timestamp ); return array( 'id' => (int) $coupon_id, 'code' => $code ); } $attempts++; } return false; } private function generate_coupon_code( $length = 5 ) { $chars = 'ABCDEFGHJKLMNPQRSTUVWXYZ23456789'; $code = 'ZC-'; // پیشوند برای شناسایی راحت‌تر for ( $i = 0; $i < $length; $i++ ) { $code .= $chars[ wp_rand( 0, strlen( $chars ) - 1 ) ]; } return $code; } private function get_ippanel_token() { $response = wp_remote_post( 'https://edge.ippanel.com/v1/auth/login', array( 'timeout' => 20, 'headers' => array( 'Content-Type' => 'application/json' ), 'body' => wp_json_encode( array( 'username' => $this->ippanel_username, 'password' => $this->ippanel_password ) ), ) ); if ( is_wp_error( $response ) ) return false; $body = json_decode( wp_remote_retrieve_body( $response ), true ); return ! empty( $body['data']['token'] ) ? $body['data']['token'] : false; } private function send_pattern_sms( $phone, $coupon_code ) { $token = $this->get_ippanel_token(); if ( ! $token ) return array( 'success' => false, 'message' => 'IPPANEL login failed' ); $response = wp_remote_post( 'https://edge.ippanel.com/v1/messages/patterns/send', array( 'timeout' => 20, 'headers' => array( 'Authorization' => $token, 'Content-Type' => 'application/json' ), 'body' => wp_json_encode( array( 'pattern_code' => $this->pattern_code, 'originator' => $this->sender_number, 'recipient' => $phone, 'values' => array( 'code' => $coupon_code ), ) ), ) ); if ( is_wp_error( $response ) ) return array( 'success' => false, 'message' => 'Network error' ); $http_code = (int) wp_remote_retrieve_response_code( $response ); return ( $http_code >= 200 && $http_code < 300 ) ? array( 'success' => true, 'message' => 'Sent' ) : array( 'success' => false, 'message' => 'Send failed' ); } public function track_coupon_usage( $order_id ) { $order = wc_get_order( $order_id ); if ( ! $order ) return; $codes = $order->get_coupon_codes(); if ( empty( $codes ) ) return; global $wpdb; foreach ( $codes as $code ) { $wpdb->update( $this->logs_table, array( 'is_used' => 1, 'order_id' => $order_id, 'used_at' => current_time( 'mysql' ) ), array( 'coupon_code' => strtoupper( $code ) ), array( '%d', '%d', '%s' ), array( '%s' ) ); } } public function add_admin_menu() { add_menu_page( 'گزارش پیامک‌های تخفیف', 'گزارش پیامک تخفیف', 'manage_options', 'zc-sms-reports', array( $this, 'render_reports_page' ), 'dashicons-chart-line', 56 ); } public function render_reports_page() { global $wpdb; $total_sent = (int) $wpdb->get_var( "SELECT COUNT(*) FROM {$this->logs_table} WHERE sms_status = 'sent'" ); $total_failed = (int) $wpdb->get_var( "SELECT COUNT(*) FROM {$this->logs_table} WHERE sms_status = 'failed'" ); $total_used = (int) $wpdb->get_var( "SELECT COUNT(*) FROM {$this->logs_table} WHERE is_used = 1" ); $records = $wpdb->get_results( "SELECT phone, coupon_code, sms_status, sms_response, is_used, created_at FROM {$this->logs_table} ORDER BY id DESC LIMIT 50" ); ?>

گزارش پیامک‌های تخفیف

ارسال موفق:
ارسال ناموفق:
استفاده شده:
شمارهکد تخفیفوضعیتاستفادهتاریخپاسخ سرور
phone; ?>coupon_code; ?>sms_status; ?>is_used ? 'بله' : 'خیر'; ?>created_at; ?>sms_response; ?>
get_id(); ?>